package dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 * @auther hewenhui
 * @see <a href="hetp://www.codingmaster.com> java </a>
 */


//这是一个实体类，也是一个工具类，用于完成Blog 表的增删改查
public class BlogDao {
    // 增
    public static void insert(Blog blog){
        //构造插入语句
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        try {
            //1，和数据库建立连接
            connection=DBUtil.getConnection();
            //2，构造失去了语句
            String sql="insert into blog values(null,?,?,?,now());";
            preparedStatement=connection.prepareStatement(sql);
            preparedStatement.setString(1,blog.getTitle());
            preparedStatement.setString(2,blog.getContent());
            preparedStatement.setInt(3,blog.getUserId());
            //3，执行sql语句
            preparedStatement.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            //4，关闭资源
            DBUtil.close(connection,preparedStatement,null);
        }

    }
    // 删
    public static void delete(int blogId){
        // 删除和增加以及修改好像都不要使用ResultSet对象，因为没有返回的内容
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        try {
            //1,连接数据库
            connection=DBUtil.getConnection();
            //2，构造失去了 语句
            String sql = "delete from blog where blogId = ?;";
            preparedStatement=connection.prepareStatement(sql);
            preparedStatement.setInt(1,blogId);
            //3，执行
            preparedStatement.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            //4,关闭资源
            DBUtil.close(connection,preparedStatement,null);
        }

    }


    // 改：按理来说，如果我改了博客的内容，那么标题，正文，以及时间都有可能改变，还要涉及追加内容
    //写错一个字母，整个单词颜色都变啦，idea真神奇！
    public static void update(Blog blog){
        Connection connection=null;
        PreparedStatement statement=null;
        try {
            //1,连接数据库
            connection=DBUtil.getConnection();
            //2,构造sql语句
            String sql = "update blog set title='?',content='?',postTime=now();";
            statement = connection.prepareStatement(sql);
            statement.setString(1,blog.getTitle());
            statement.setString(2,blog.getContent());
            //3,执行
            statement.executeUpdate();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }finally {
            //4,关闭连接
            DBUtil.close(connection,statement,null);
        }
    }
    // 查-根据blogId查询某一篇博客
    public static Blog selectOne(int blogId){
        Connection connection=null;
        PreparedStatement Statement=null;
        ResultSet resultSet=null;
        try {
            //1,连接数据库
            connection=DBUtil.getConnection();
            //2，构造查询语句
            String sql = "select * from blog where blogId = ?;";
            Statement=connection.prepareStatement(sql);
            Statement.setInt(1,blogId);
            //3,执行
            resultSet = Statement.executeQuery();
            //执行完了以后，我们需要根据查询结果把返回的Blog对象给构造出来
            //resultSet.next() 这个就是迭代遍历用的相当于foreach
            Blog blog = new Blog();
            if(resultSet.next()){
                blog.setBlogId(resultSet.getInt("blogId"));
                blog.setTitle(resultSet.getString("title"));
                blog.setContent(resultSet.getString("content"));
                blog.setUserId(resultSet.getInt("userId"));
                //注意参数的类型，类名一样不代表同一个类，可能是来自不同的包的类
                blog.setPostTime(resultSet.getTimestamp("postTime"));
                return blog;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            DBUtil.close(connection,Statement,resultSet);
        }
        return null;
    }

    // 查-根据userId查询用户所有的博客
    public static List<Blog> selectAll(int userId){
        Connection connection=null;
        PreparedStatement Statement=null;
        ResultSet resultSet=null;

        //注意，此时的blogs分配了内存空间，所以blogs!=null
        List<Blog> blogs = new ArrayList<>();
        try {
            //1,连接数据库
            connection=DBUtil.getConnection();
            //2，构造查询语句
            String sql = "select * from blog where userId = ? order by postTime desc; ";
            Statement=connection.prepareStatement(sql);
            Statement.setInt(1,userId);
            //3,执行
            resultSet = Statement.executeQuery();
            //执行完了以后，我们需要根据查询结果把返回的Blog对象给构造出来
            //resultSet.next() 这个就是迭代遍历用的相当于foreach
            int i=0;
            while (resultSet.next()){
                Blog blog = new Blog();
                blog.setBlogId(resultSet.getInt("blogId"));
                blog.setTitle(resultSet.getString("title"));
                blog.setContent(resultSet.getString("content"));
                blog.setUserId(resultSet.getInt("userId"));
                //注意参数的类型，类名一样不代表同一个类，可能是来自不同的包的类
                blog.setPostTime(resultSet.getTimestamp("postTime"));
                blogs.add(blog);
                i++;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            DBUtil.close(connection,Statement,resultSet);
        }
        return blogs;
        //return null;这里如果写成返回null,那么return blogs;就要写在try{}里面，这样有无查询结果的返回类型不统一
        //如果在这里 返回blogs,要么返回空列表，要么返回非空列表，都是列表。

    }
}
